import sys
from PySide6.QtWidgets import *
from PySide6.QtGui import Qt
import win32service
import win32serviceutil
from PySide6.QtCore import QObject, Signal


class FormLayoutDemo(QWidget):
    
    text_status = []
    lable_status = []
    btn_start = []
    btn_stop = []
    svc_name_list = ['postgresql-x64-12','frpc','postgresql-x64-13',
                     'pid-config-data', 'pid-nginx-middleware']
    
    value_changed = Signal(str, object)
    def __init__(self, parent=None):
        super().__init__(parent)
        self.svc_dic = {}
        self.value_changed.connect(self.on_value_changed)
        self.ini_ui()
        self.ini_status()

    def set_value(self, key, value):
        self.svc_dic[key] = value
        self.value_changed.emit(key, value)

    def ini_status(self):
        for i in range(len(self.svc_name_list)):
            value = self.query_svc_status(
                self.svc_name_list[i])
            self.set_value(self.svc_name_list[i],  value)
            

        print(self.svc_dic)

    def ini_ui(self):
        self.setWindowTitle("Form Layout Demo")

        layout = QFormLayout(self)

        for i in range(len(self.svc_name_list)):
            # print(self.svc_name_list[i])
            self.svc_dic[self.svc_name_list[i]] = -1
            status_value = self.svc_dic[self.svc_name_list[i]]
            if status_value is None:
                status_value = -1
            hbox = QHBoxLayout()
            
            qlabl = QLabel("未知", self)
            qlabl.setStyleSheet('color:grey')
            self.lable_status.append(qlabl)

            
            btn_start = QPushButton("启动服务")
            self.btn_start.append(btn_start)
            btn_start.clicked.connect(self.handle_start_svc)

            btn_stop = QPushButton("停止服务")
            self.btn_stop.append(btn_stop)
            btn_stop.clicked.connect(self.handle_stop_svc)
            
            hbox.addWidget(qlabl)
            hbox.addWidget(btn_start)
            hbox.addWidget(btn_stop)

            layout.addRow(self.svc_name_list[i], hbox)

        self.setLayout(layout)

    def query_svc_status(self, svc_name):
        # 查询服务的状态
        # SERVICE_STOPPED (1): 服务已停止
        # SERVICE_START_PENDING (2): 服务正在启动
        # SERVICE_STOP_PENDING (3): 服务正在停止
        # SERVICE_RUNNING (4): 服务正在运行
        # SERVICE_CONTINUE_PENDING (5): 服务正在继续
        # SERVICE_PAUSE_PENDING (6): 服务正在暂停
        # SERVICE_PAUSED (7): 服务已暂停

        # 自定义 -1 错误状态
        try:
            status_obj = win32serviceutil.QueryServiceStatus(svc_name)
            print(f'{svc_name} - {status_obj}')
        except Exception as err:
            print(err)
            return -1

        if status_obj is not None:
            return status_obj[1]
        else:
            return -1

    def handle_start_svc(self):
        
        # print("开始按钮已禁用，防止重复点击。")
        btn = self.sender()
        index = self.btn_start.index(btn)
        svc_name = self.svc_name_list[index]
        
        print(f"正在开启{svc_name}服务")
        
        try:
            win32serviceutil.StartService(serviceName=svc_name)
            # 等待服务启动完成
            win32serviceutil.WaitForServiceStatus(
                serviceName=svc_name, status=4, waitSecs=5)
        except Exception as ex:
            print(ex)
        
        status = win32serviceutil.QueryServiceStatus(svc_name)
        print(f"--------{status[1]}-------")
        self.set_value(svc_name,status[1])
        print(f"{svc_name}服务状态：{status}")

    def handle_stop_svc(self):
        btn = self.sender()
        index = self.btn_stop.index(btn)
        svc_name = self.svc_name_list[index]
        print(f"正在关闭{svc_name}服务")
        try:
            win32serviceutil.StopService(serviceName=svc_name)
            # 等待服务关闭完成
            win32serviceutil.WaitForServiceStatus(
                serviceName=svc_name, status=1, waitSecs=5)
        except Exception as ex:
            print(ex)
        status = win32serviceutil.QueryServiceStatus(svc_name)
        self.set_value(svc_name,status[1])
        print(f"{svc_name}服务状态：{status}")

    def on_value_changed(self, key, value):
        print(f"Value for key '{key}' changed to '{value}'")
        index = self.svc_name_list.index(key)
        svc_name = key
        
        i = 10
        if value == '':
            pass
        else:
            i = int(value)
        # SERVICE_STOPPED (1): 服务已停止
        # SERVICE_START_PENDING (2): 服务正在启动
        # SERVICE_STOP_PENDING (3): 服务正在停止
        # SERVICE_RUNNING (4): 服务正在运行
        # SERVICE_CONTINUE_PENDING (5): 服务正在继续
        # SERVICE_PAUSE_PENDING (6): 服务正在暂停
        # SERVICE_PAUSED (7): 服务已暂停

        # 自定义 -1 错误状态
        if (i == -1):
            self.lable_status[index].setText("错误")
            self.btn_stop[index].setEnabled(False)
            self.btn_start[index].setEnabled(False)
        elif (i == 1):
            self.lable_status[index].setText("服务已停止")
            self.btn_stop[index].setEnabled(False)
            self.btn_start[index].setEnabled(True)
        elif (i == 2):
            self.lable_status[index].setText("服务正在启动中...")
            self.btn_stop[index].setEnabled(False)
            self.btn_start[index].setEnabled(False)
        elif (i == 3):
            self.lable_status[index].setText("服务正在停止中...")
            self.btn_stop[index].setEnabled(False)
            self.btn_start[index].setEnabled(False)
        elif (i == 4):
            self.lable_status[index].setText("服务正在运行")
            self.btn_stop[index].setEnabled(True)
            self.btn_start[index].setEnabled(False)
        elif (i == 5):
            self.lable_status[index].setText("服务正在继续...")
            self.btn_stop[index].setEnabled(False)
            self.btn_start[index].setEnabled(False)
        elif (i == 6):
            self.lable_status[index].setText("服务正在暂停...")
            self.btn_stop[index].setEnabled(False)
            self.btn_start[index].setEnabled(False)
        elif (i == 7):
            self.lable_status[index].setText("服务已暂停")
            self.btn_stop[index].setEnabled(True)
            self.btn_start[index].setEnabled(True)
        else:
            self.lable_status[index].setText("未知")
            self.btn_stop[index].setEnabled(False)
            self.btn_start[index].setEnabled(False)


# if __name__ == "__main__":
#     app = QApplication()

#     demo = FormLayoutDemo()
    
#     demo.show()
#     # app.exec()
#     sys.exit(app.exec())
